#include <stdio.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include "simple_wifi_sta.h"
#include "nvs_flash.h"
#include "freertos/event_groups.h"
#include "driver/gpio.h"
#include "button.h"
#include "led.h"
#include "bsp_relay.h"

static const char *TAG = "main";

// 按键事件组
static EventGroupHandle_t s_pressEvent;
#define SHORT_EV BIT0 // 短按
#define LONG_EV BIT1  // 长按
#define BTN_GPIO 9

/** 短按按键回调函数
 * @param 无
 * @return 无
 */
void short_press_handle(void)
{
    xEventGroupSetBits(s_pressEvent, SHORT_EV);
}

/** 长按按键回调函数
 * @param 无
 * @return 无
 */
void long_press_handle(void)
{
    xEventGroupSetBits(s_pressEvent, LONG_EV);
}

void app_main(void)
{
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        // NVS出现错误，执行擦除
        ESP_ERROR_CHECK(nvs_flash_erase());
        // 重新尝试初始化
        ESP_ERROR_CHECK(nvs_flash_init());
    }
    wifi_sta_init(); // 初始化wifi
    led_breath_init();
    Relay_GPIO_Init();

    s_pressEvent = xEventGroupCreate();
    button_config_t btn_cfg =
        {
            .gpio_num = BTN_GPIO,           // gpio号
            .active_level = 0,              // 按下的电平
            .long_press_time = 3000,        // 长按时间
            .short_cb = short_press_handle, // 短按回调函数
            .long_cb = long_press_handle    // 长按回调函数
        };
    button_event_set(&btn_cfg); // 添加按键响应事件处理
    EventBits_t ev;

    while (1)
    {
        ev = xEventGroupWaitBits(s_pressEvent, SHORT_EV | LONG_EV, pdTRUE, pdFALSE, portMAX_DELAY);
        if (ev & SHORT_EV)
        {
            // 短按事件，亮一下熄灭
            Set_Relay_Switch(1); // 控制继电器吸合
            vTaskDelay(1000 / portTICK_PERIOD_MS);
            printf("\r\n继电器吸合!\r\n");

            Set_Relay_Switch(0); // 控制继电器断开
            vTaskDelay(1000 / portTICK_PERIOD_MS);
            printf("\r\n继电器断开!\r\n");
        }
        if (ev & LONG_EV)
        {
            bleconfig_start();
        }
        xEventGroupClearBits(s_pressEvent, SHORT_EV);
        xEventGroupClearBits(s_pressEvent, LONG_EV);
    }
}
